#include "app_message.h"
#include "app_common.h"
#include "string.h"
#include "cJSON.h"
#include "stdlib.h"
#include "log.h"

/**
 *  @brief  把字节数组转换成json字符串
 * @param  data   字节数组
 * @param  len  字节数组长度
 * @return  json字符串
 * 步骤 ：
 * 1  从字节数组中把对应的3个值提取出来 1 conn_type 2 id 3 msg
 * 2  要把id 和msg 从字节数组转换为16进的字符串
 * 3  拼接为json
 */
char *app_message_bytes_to_json(const char *buf, int len)
{
    int conn_type = buf[0]; // 连接类型
    int id_len = buf[1];    // ID长度
    int msg_len = buf[2];   // 消息长度
    char id_bytes[id_len];  // ID数据
    memcpy(id_bytes, buf + 3, id_len);
    char msg_bytes[msg_len]; // msg的字节数组
    memcpy(msg_bytes, buf + 3 + id_len, msg_len);

    // 2.把id msg 从字符数组转换为16进制字符串
    char *id_hexstr = app_common_bytes_to_hexstr(id_bytes, id_len);
    char *msg_hexstr = app_common_bytes_to_hexstr(msg_bytes, msg_len);

    // 3.拼接json字符串
    cJSON *root = cJSON_CreateObject();
    cJSON_AddNumberToObject(root, "conn_type", conn_type);
    cJSON_AddStringToObject(root, "id", id_hexstr);
    cJSON_AddStringToObject(root, "msg", msg_hexstr);
    char *json = cJSON_PrintUnformatted(root);

    // 4.释放内存
    cJSON_Delete(root);
    free(id_hexstr);
    free(msg_hexstr);

    return json;
}

/**
 * @brief json转bytes
 * 步骤：1.从json中获取conn_type、id、msg
 * 2.把id、msg从16进制字符串转换为字节数组
 * 3.把3个值拼接成字节数组
 */
int app_message_json_to_bytes(const char *json, char *buf, int buf_len)
{
    // 1.从json中获取conn_type、id、msg
    cJSON *root = cJSON_Parse(json);
    cJSON *conn_type_cjson = cJSON_GetObjectItem(root, "conn_type");
    cJSON *id_cjson = cJSON_GetObjectItem(root, "id");
    cJSON *msg_cjson = cJSON_GetObjectItem(root, "msg");
    int conn_type = conn_type_cjson->valueint;
    char *id_hexstr = id_cjson->valuestring;
    char *msg_hexstr = msg_cjson->valuestring;
    // 2.把id、msg从16进制字符串转换为字节数组
    int id_len = strlen(id_hexstr) / 2;
    char id[id_len];
    id_len = app_common_hexstr_to_bytes(id_hexstr, id, id_len);

    int msg_len = strlen(msg_hexstr) / 2;
    char msg[msg_len];
    msg_len = app_common_hexstr_to_bytes(msg_hexstr, msg, msg_len);

    // 3.把3个值拼接成字节数组
    int bytes_len = 3 + id_len + msg_len;
    if (buf_len < bytes_len)
    {
        log_error("buf_len is not enough");
        return -1; // 错误：长度不合法
    }

    buf[0] = conn_type;                     // 连接类型
    buf[1] = id_len;                        // ID长度
    buf[2] = msg_len;                       // 消息长度
    memcpy(buf + 3, id, id_len);            // ID数据
    memcpy(buf + 3 + id_len, msg, msg_len); // 消息数据

    // 4.释放内存
    cJSON_Delete(root);
    return bytes_len; // 返回转换后的长度
}
